package Class04_MethodReference;

import java.io.PrintStream;

/**\
 * Method reference demo
 *
 * 哪些方法可以进行方法引用
 * 类方法/构造方法/实例方法 前提：被引用的方法与函数式接口抽象方法参数列表相同，返回值类型相同
 *
 * 类方法引用（静态方法的引用）
 * 类名::静态方法名 eg:Integer::parseInt
 *
 * 构造方法的引用
 * 类名::new  eg:Student::new
 *
 * 实例方法的引用
 * 对象名::方法名 eg："Hello"::toUpperCase
 */
public class L01MethodReference01 {
    public static void main(String[] args) {

        //使用Lambda表达式实现
        // 调用printString方法,方法的参数Printable是一个函数式接口,所以可以传递Lambda
        printString(s -> {
            System.out.println(s);
        });

        /*
        分析：
            为什么需要方法引用？
            当Lambda表达式所要完成的业务逻辑已经存在————已经有某个函数实现了
            我们可以直接引用对应的方法（函数），即方法引用

            普通方法引用：
                对象名 :: 方法名
         */
        PrintStream out = System.out;
//        printString(System.out::println);
        printString(out::println);
    }



    // 定义一个方法,参数传递Printable接口,对字符串进行打印
    public static void printString(Printable p) {
        p.print("HelloWorld");
    }
}
